# -*- coding: utf-8 -*-
"""
@Time    : 2024/8/30 15:39 
@Author  : ZhangShenao 
@File    : pdfplumber_demo.py 
@Desc    : 使用pdfplumber解析PDF文件

pdfplumber项目基于pdfminer.six开发,支持解析PDF文件,获取每个文本字符、矩形和线条的详细信息
此外还支持表格提取和可视化调试
对于机器生成的PDF而言效果最佳
不适用于扫描得到的PDF
"""
import pandas as pd
import pdfplumber

# 加载PDF文件,返回一个pdfplumber.PDF对象
# pdfplumber.PDF是PDF文件的顶层对象
# 它包含metadata元数据和pages列表
book_pdf = pdfplumber.open("./resource/The_Old_Man_of_the_Sea.pdf")
# 获取PDF元数据,包括标题、作者、创建时间、修改时间等
print(f"metadata: {book_pdf.metadata}")
# 获取页数
# PDF原始文件的每一页,都对应一个Page对象
print(f"page count: {len(book_pdf.pages)}")

test_pdf = pdfplumber.open("./resource/test.pdf")
test_pages = test_pdf.pages
print(f"pages of test_pdf: {test_pages}")

# 可视化第一页
# test_pdf.pages[0].to_image().show()

# 可视化第二页,需要调整分辨率和抗锯齿
# test_pdf.pages[1].to_image().show()

# 提取单页文本
# page1_text = test_pdf.pages[0].extract_text()
# print(f"page1_text: {page1_text}")

# 提取单页文本,并保留布局
# 文本中的表格也会被提取出来
page1_text = test_pdf.pages[0].extract_text(layout=True)
print(f"page1_text: {page1_text}")

# 提取单个表格
# 每个表格都会被处理成一个二维list,每个list对应一行数据
table = test_pdf.pages[0].extract_table()
print(f"table: \n{table}")

# 使用Pandas.DataFrame来展示和存储表格
df = pd.DataFrame(data=table[1:], columns=table[0])
print(f"table DataFrame: \n{df}")

# 获取PageImage对象,可以得到页面中图片的位置、分辨率相关信息
img = test_pdf.pages[1].images[0]
print(img)

# 裁剪图片
bbox = (img["x0"], img["top"], img["x1"], img["bottom"])
cropped_page = test_pdf.pages[1].crop(bbox)
cropped_img = cropped_page.to_image()
cropped_img.save("./resource/images/cropped_img.png")

# 裁剪图片+抗锯齿
antialias_img = cropped_page.to_image(antialias=True)
antialias_img.save("./resource/images/antialias_img.png")

# 裁剪图片+高分辨率
hq_img = cropped_page.to_image(resolution=1080)
hq_img.save("./resource/images/hq_img.png")
